package com.motu.vertx.module.utility.logsdk;

import io.vertx.core.json.JsonArray;
import io.vertx.core.json.JsonObject;

import java.util.ArrayList;
import java.util.List;

public class PushManager {

    /**
     * mob（国内推送只能用mob）
     * 1、ID推送每次推送的ID列表需要在1000个以内
     * 2、每个设备最多设置100个标签
     * 3、推送接口的接口频率限制，默认500次/分钟；
     *
     * fcm（海外和港澳台推送只能用fcm）
     * 1、每次调用时，最多可以指定 500 个设备注册令牌（类似mob的ID）
     * 2、一个应用实例最多只能订阅 2000 个主题（类似mob的标签）
     *
     * 两个sdk的限制不一样，如果要共用只能取最小值了，每次推送500个ID，每个设备最多设置100个标签
     *
     * mob和fcm只能选取一个，可以根据开关或者参数控制
     *
     * 多语言注意事项
     * 1、id(token)列表推送，需要对推送的玩家列表进行语言归类后，然后根据各自语言获取文字后发送
     * 2、标签(主题)推送，可以定义一个语言数组参数，遍历这个数组获取对应语言文字后发送
     */

    public static final int PUSH_ID_SIZE_MAX = 500;// 单次推送ID列表最大长度

    /**
     * 计算推送ID列表分成多少次发送
     * @param pushIdArray 推送ID列表
     * @return 推送列表
     */
    private static List<JsonArray> countPushIdArray(JsonArray pushIdArray){
        List<JsonArray> result = new ArrayList<>();
        // 超过500个则分批发送
        if (pushIdArray.size() > PUSH_ID_SIZE_MAX){
            int num = pushIdArray.size() / PUSH_ID_SIZE_MAX;
            if (pushIdArray.size() % PUSH_ID_SIZE_MAX > 0){
                num++;
            }
            for (int i = 0; i < num; i++) {
                int start = i * PUSH_ID_SIZE_MAX;
                int end = (i + 1) * PUSH_ID_SIZE_MAX;
                end = Math.min(pushIdArray.size(), end);
                List list = pushIdArray.getList().subList(start, end);
                result.add(new JsonArray(list));
            }
        } else{
            result.add(pushIdArray);
        }
        return result;
    }

    /**
     * mob推送（根据mobid推送）
     * @param mobIdArray 推送ID列表
     */
    public static void pushMobData(String title, String content, JsonArray mobIdArray){
        // 超过500个则分批发送
        List<JsonArray> list = countPushIdArray(mobIdArray);
        for (JsonArray pushIdArray : list){
            JsonObject pushTarget = new JsonObject();
            pushTarget.put("target", 4);//推送范围:1广播；2别名；3标签；4regid；5地理位置;6用户分群
            pushTarget.put("rids", pushIdArray);//设置推送Registration Id集合[“Id1″,”id2”]，target=4则必选
            JsonObject obj = getMobData(title, content, pushTarget);
            LogSDKManager.pushToQueue(LogSDKManager.KAFKA_TOPIC_MOBPUST, obj);
        }
    }

    /**
     * mob推送（根据mob标签推送）
     * @param tag 最多只能定义100个标签
     */
    public static void pushMobData(String title, String content, String tag){
        JsonObject pushTarget = new JsonObject();
        pushTarget.put("target", 3);//推送范围:1广播；2别名；3标签；4regid；5地理位置;6用户分群
        pushTarget.put("tags", new JsonArray().add(tag));
        JsonObject obj = getMobData(title, content, pushTarget);
        LogSDKManager.pushToQueue(LogSDKManager.KAFKA_TOPIC_MOBPUST, obj);
    }

    /**
     * mob推送（根据mobid推送）
     * @param mobIdArray 推送ID列表
     */
    public static void pushMobData(String title, String content, int offlineSeconds, JsonArray mobIdArray){
        // 超过500个则分批发送
        List<JsonArray> list = countPushIdArray(mobIdArray);
        for (JsonArray pushIdArray : list){
            JsonObject pushTarget = new JsonObject();
            pushTarget.put("target", 4);//推送范围:1广播；2别名；3标签；4regid；5地理位置;6用户分群
            pushTarget.put("rids", pushIdArray);//设置推送Registration Id集合[“Id1″,”id2”]，target=4则必选
            JsonObject obj = getMobData(title, content, offlineSeconds, pushTarget);
            LogSDKManager.pushToQueue(LogSDKManager.KAFKA_TOPIC_MOBPUST, obj);
        }
    }

    /**
     * mob推送（根据mob标签推送）
     * @param tag 最多只能定义100个标签
     */
    public static void pushMobData(String title, String content, int offlineSeconds, String tag){
        JsonObject pushTarget = new JsonObject();
        pushTarget.put("target", 3);//推送范围:1广播；2别名；3标签；4regid；5地理位置;6用户分群
        pushTarget.put("tags", new JsonArray().add(tag));
        JsonObject obj = getMobData(title, content, offlineSeconds, pushTarget);
        LogSDKManager.pushToQueue(LogSDKManager.KAFKA_TOPIC_MOBPUST, obj);
    }

    private static JsonObject getMobData(String title, String content, JsonObject pushTarget){
        JsonObject pushNotify = new JsonObject();
        pushNotify.put("title", title);//推送标题
        pushNotify.put("content", content);//推送内容

        JsonObject obj = new JsonObject();
        obj.put("pushTarget", pushTarget);
        obj.put("pushNotify", pushNotify);
        return obj;
    }

    private static JsonObject getMobData(String title, String content, int offlineSeconds, JsonObject pushTarget){
        JsonObject pushNotify = new JsonObject();
        pushNotify.put("title", title);//推送标题
        pushNotify.put("content", content);//推送内容
        pushNotify.put("offlineSeconds", offlineSeconds); // 离线消息保存时间（单位秒，不填默认86400）

        JsonObject obj = new JsonObject();
        obj.put("pushTarget", pushTarget);
        obj.put("pushNotify", pushNotify);
        return obj;
    }

    /**
     * fcm推送（根据fcmtoken推送）
     * @param fcmTokenArray 推送token列表
     */
    public static void pushFcmData(String title, String content, JsonArray fcmTokenArray){
        // 超过500个则分批发送
        List<JsonArray> list = countPushIdArray(fcmTokenArray);
        for (JsonArray pushIdArray : list){
            JsonObject obj = new JsonObject();
            obj.put("title", title);
            obj.put("content", content);
            obj.put("tokens", pushIdArray);
            LogSDKManager.pushToQueue(LogSDKManager.KAFKA_TOPIC_FCMPUSH, obj);
        }
    }

    /**
     * fcm推送（根据fcm主题推送）
     * @param topic 最多只能定义100个主题
     */
    public static void pushFcmData(String title, String content, String topic){
        JsonObject obj = new JsonObject();
        obj.put("title", title);
        obj.put("content", content);
        obj.put("topic", topic);
        LogSDKManager.pushToQueue(LogSDKManager.KAFKA_TOPIC_FCMPUSH, obj);
    }

}
